package com.learn.excel.core.util;

import cn.hutool.core.date.DateTime;
import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * @Date: 2020/6/19 14:52
 */
@Slf4j
public class DateUtil {
    //    private int x;                  // 日期属性：年
    //    private int y;                  // 日期属性：月
    //    private int z;                  // 日期属性：日
    //    private Calendar localTime;     // 当前日期
    //    public DateUtil() {
    //        localTime = Calendar.getInstance();
    //    }

    /**
     * 功能：得到当前日期 格式为：xxxx-yy-zz (eg: 2007-12-05)<br>
     *
     * @return String
     * @author pure
     */
    public static String today(Date dateTime) {
        Calendar localTime = Calendar.getInstance();    // 当前日期
        localTime.setTime(dateTime);
        int x;                  // 日期属性：年
        int y;                  // 日期属性：月
        int z;                  // 日期属性：日
        String strY = null;
        String strZ = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        z = localTime.get(Calendar.DATE);
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        strZ = z >= 10 ? String.valueOf(z) : ("0" + z);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能：得到当前月份月初 格式为：xxxx-yy-zz (eg: 2007-12-01)<br>
     *
     * @return String
     * @author pure
     */
    public static String thisMonth(Date dateTime) {
        Calendar localTime = Calendar.getInstance();    // 当前日期
        localTime.setTime(dateTime);
        int x;                  // 日期属性：年
        int y;                  // 日期属性：月
        int z;                  // 日期属性：日
        String strY = null;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-01";
    }

    /**
     * 功能：得到当前月份月底 格式为：xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public static String thisMonthEnd(Date dateTime) {
        Calendar localTime = Calendar.getInstance();    // 当前日期
        localTime.setTime(dateTime);
        int x;                  // 日期属性：年
        int y;                  // 日期属性：月
        int z;                  // 日期属性：日
        String strY = null;
        String strZ = null;
        boolean leap = false;
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12) {
            strZ = "31";
        }
        if (y == 4 || y == 6 || y == 9 || y == 11) {
            strZ = "30";
        }
        if (y == 2) {
            leap = leapYear(x);
            if (leap) {
                strZ = "29";
            } else {
                strZ = "28";
            }
        }
        strY = y >= 10 ? String.valueOf(y) : ("0" + y);
        return x + "-" + strY + "-" + strZ;
    }

    /**
     * 功能：得到当前季度季初 格式为：xxxx-yy-zz (eg: 2007-10-01)<br>
     *
     * @return String
     * @author pure
     */
    public static String thisSeason(Date dateTime) {
        Calendar localTime = Calendar.getInstance();    // 当前日期
        localTime.setTime(dateTime);
        int x;                  // 日期属性：年
        int y;                  // 日期属性：月
        int z;                  // 日期属性：日
        String dateString = "";
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        if (y >= 1 && y <= 3) {
            dateString = x + "-" + "01" + "-" + "01";
        }
        if (y >= 4 && y <= 6) {
            dateString = x + "-" + "04" + "-" + "01";
        }
        if (y >= 7 && y <= 9) {
            dateString = x + "-" + "07" + "-" + "01";
        }
        if (y >= 10 && y <= 12) {
            dateString = x + "-" + "10" + "-" + "01";
        }
        return dateString;
    }

    /**
     * 功能：得到当前季度季末 格式为：xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public static String thisSeasonEnd(Date dateTime) {
        Calendar localTime = Calendar.getInstance();    // 当前日期
        localTime.setTime(dateTime);
        int x;                  // 日期属性：年
        int y;                  // 日期属性：月
        int z;                  // 日期属性：日
        String dateString = "";
        x = localTime.get(Calendar.YEAR);
        y = localTime.get(Calendar.MONTH) + 1;
        if (y >= 1 && y <= 3) {
            dateString = x + "-" + "03" + "-" + "31";
        }
        if (y >= 4 && y <= 6) {
            dateString = x + "-" + "06" + "-" + "30";
        }
        if (y >= 7 && y <= 9) {
            dateString = x + "-" + "09" + "-" + "30";
        }
        if (y >= 10 && y <= 12) {
            dateString = x + "-" + "12" + "-" + "31";
        }
        return dateString;
    }

    /**
     * 功能：得到当前年份年初 格式为：xxxx-yy-zz (eg: 2007-01-01)<br>
     *
     * @return String
     * @author pure
     */
    public static String thisYear(Date dateTime) {
        Calendar localTime = Calendar.getInstance();    // 当前日期
        localTime.setTime(dateTime);
        int x;                  // 日期属性：年
        int y;                  // 日期属性：月
        int z;                  // 日期属性：日
        x = localTime.get(Calendar.YEAR);
        return x + "-01" + "-01";
    }

    /**
     * 功能：得到当前年份年底 格式为：xxxx-yy-zz (eg: 2007-12-31)<br>
     *
     * @return String
     * @author pure
     */
    public static String thisYearEnd(Date dateTime) {
        Calendar localTime = Calendar.getInstance();    // 当前日期
        localTime.setTime(dateTime);
        int x;                  // 日期属性：年
        int y;                  // 日期属性：月
        int z;                  // 日期属性：日
        x = localTime.get(Calendar.YEAR);
        return x + "-12" + "-31";
    }

    /**
     * 功能：判断输入年份是否为闰年<br>
     *
     * @return 是：true  否：false
     * @author pure
     */
    public static boolean leapYear(int year) {
        boolean leap;
        if (year % 4 == 0) {
            if (year % 100 == 0) {
                if (year % 400 == 0) {
                    leap = true;
                } else {
                    leap = false;
                }
            } else {
                leap = true;
            }
        } else {
            leap = false;
        }
        return leap;
    }

    /**
     * 使用Calendar对象计算时间差，可以按照需求定制自己的计算逻辑 时间格式为：yyyy-MM-dd HH:mm:ss
     *
     * @return 返回为小时
     */
    public static int calculateTimeDifference(String startTime, String endTime) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int timeLong = 0;
        try {
            timeLong = 0;
            long st = formatter.parse(startTime).getTime();
            long et = formatter.parse(endTime).getTime();
            timeLong = (int) ((et - st) / 1000 / 3600);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return timeLong;
    }

    /**
     * 使用Calendar对象计算与当前时间差，如果超过当前时间，则返回当前时间，否则返回原时间 时间格式为：yyyy-MM-dd HH:mm:ss
     *
     * @return 返回为小时
     */
    public static String calculateNowTimeDifference(String dateTime) {
        if (null == dateTime) {
            return null;
        }
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            long st = formatter.parse(dateTime).getTime();
            long et = System.currentTimeMillis();
            if (et - st >= 0) {
                return dateTime;
            } else {
                return formatter.format(new Date());
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用Calendar对象计算时间差，可以按照需求定制自己的计算逻辑 时间格式为：毫秒秒
     *
     * @return 返回为秒
     */
    public static long calculateTimeDifference(long startTime, long endTime) {
        return (endTime - startTime) / 1000;
    }

    /**
     * @Return 时间格式为：yyyy-MM-dd HH:mm:ss
     */
    public static String format(Date startTime) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return formatter.format(startTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @Return 时间格式为：yyyy-MM-dd HH:mm:ss
     */
    public static String format(long dateTime) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return formatter.format(new Date(dateTime));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     *
     */
    public static Date format(String startTime) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return formatter.parse(startTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * @Return 时间格式为：yyyy-MM-dd HH:mm:ss
     */
    public static String getHourStart(String startTime) {
        String[] split = startTime.split(":");
        if (3 != split.length) {
            return null;
        }
        return split[0] + ":00:00";
    }

    /**
     * @Return 时间格式为：yyyy-MM-dd HH:mm:ss
     */
    public static String getNextHourStart(String startTime) {
        try {
            String[] split = startTime.split(":");
            if (3 != split.length) {
                return null;
            }
            if ("00".equals(split[1]) && "00".equals(split[2])) {
                return startTime;
            }
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = formatter.parse(startTime);
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.add(Calendar.HOUR_OF_DAY, 1);
            String[] dateTimeStrs = (formatter.format(c.getTime())).split(":");
            return dateTimeStrs[0] + ":00:00";
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Date lastNDayDate(Date date, int day) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_WEEK, -day);
        return c.getTime();
    }

    /**
     * 上一个月
     */
    public static Date lastMonthDate(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MONTH, -1);
        return c.getTime();
    }

    public static Date lastYearDate(Date date) {
        //过去一年
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.YEAR, -2);
        return c.getTime();
    }

    public static Date last2YearDate(Date date) {
        //过去一年
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.YEAR, -2);
        return c.getTime();
    }

    /**
     * 对日期时间字符串加一秒
     */
    public static String plusSeconds(String dataStr) {
        DateTimeFormatter formatter;
        try {
            formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        } catch (Exception e) {
            log.error("时间转换异常, dataTime:{}", dataStr);
            return null;
        }
        LocalDateTime parse = LocalDateTime.parse(dataStr, formatter);
        LocalDateTime localDateTime = parse.plusSeconds(1);
        String s = localDateTime.toString();
        return s.replace("T", " ");
    }

    /**
     * 对日期时间字符串加一秒 毫秒
     */
    public static String plusMillisecond(String dataStr) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date parse;
        try {
            parse = format.parse(dataStr);
        } catch (ParseException e) {
            log.error("时间转换异常, dataTime:{}", dataStr);
            return null;
        }
        DateTime dateTime = cn.hutool.core.date.DateUtil.offsetMillisecond(parse, 1);
        return dateTime.toString(format);
    }

}
